home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / prolog / prlgbnc1.lha / Bench / browse.pl < prev    next >
Text File  |  1990-07-13  |  2KB  |  101 lines

  1. % generated: 19 June 1990
  2. % option(s): 
  3. %
  4. %   browse
  5. %
  6. %   Tep Dobry (from Lisp version by R. P. Gabriel)
  7. %
  8. %   (modified January 1987 by Herve' Touati)
  9.  
  10. main :- 
  11.     init(100,10,4,
  12.          [[a,a,a,b,b,b,b,a,a,a,a,a,b,b,a,a,a],
  13.           [a,a,b,b,b,b,a,a,[a,a],[b,b]],
  14.           [a,a,a,b,[b,a],b,a,b,a]
  15.          ],
  16.          Symbols),
  17.     randomize(Symbols,RSymbols,21),!,
  18.     investigate(RSymbols,
  19.                 [[star(SA),B,star(SB),B,a,star(SA),a,star(SB),star(SA)],
  20.                  [star(SA),star(SB),star(SB),star(SA),[star(SA)],[star(SB)]],
  21.                  [_,_,star(_),[b,a],star(_),_,_]
  22.                 ]).
  23.  
  24.  
  25. init(N,M,Npats,Ipats,Result) :- init(N,M,M,Npats,Ipats,Result).
  26.  
  27. init(0,_,_,_,_,_) :- !.
  28. init(N,I,M,Npats,Ipats,[Symb|Rest]) :- 
  29.     fill(I,[],L),
  30.     get_pats(Npats,Ipats,Ppats),
  31.     J is M - I,
  32.     fill(J,[pattern(Ppats)|L],Symb),
  33.     N1 is N - 1,
  34.     (I =:= 0 -> I1 is M; I1 is I - 1),
  35.     init(N1,I1,M,Npats,Ipats,Rest).
  36.  
  37. fill(0,L,L) :- !.
  38. fill(N,L,[dummy([])|Rest]) :- 
  39.     N1 is N - 1,
  40.     fill(N1,L,Rest).
  41.  
  42. randomize([],[],_) :- !.
  43. randomize(In,[X|Out],Rand) :-
  44.     length(In,Lin),
  45.     Rand1 is (Rand * 17) mod 251,
  46.     N is Rand1 mod Lin,
  47.     split(N,In,X,In1),
  48.     randomize(In1,Out,Rand1).
  49.  
  50. split(0,[X|Xs],X,Xs) :- !.
  51. split(N,[X|Xs],RemovedElt,[X|Ys]) :-
  52.     N1 is N - 1,
  53.     split(N1,Xs,RemovedElt,Ys).
  54.  
  55. investigate([],_) :- !.
  56. investigate([U|Units],Patterns) :-
  57.     property(U,pattern,Data),
  58.     p_investigate(Data,Patterns),
  59.     investigate(Units,Patterns).
  60.  
  61. get_pats(Npats,Ipats,Result) :- get_pats(Npats,Ipats,Result,Ipats).
  62.  
  63. get_pats(0,_,[],_) :- !.
  64. get_pats(N,[X|Xs],[X|Ys],Ipats) :-
  65.     N1 is N - 1,
  66.     get_pats(N1,Xs,Ys,Ipats).
  67. get_pats(N,[],Ys,Ipats) :-
  68.     get_pats(N,Ipats,Ys,Ipats).
  69.  
  70. property([],_,_) :- fail.    /* don't really need this */
  71. property([Prop|_],P,Val) :-
  72.     functor(Prop,P,_),!,
  73.     arg(1,Prop,Val).
  74. property([_|RProps],P,Val) :-
  75.     property(RProps,P,Val).
  76.  
  77. p_investigate([],_).
  78. p_investigate([D|Data],Patterns) :-
  79.     p_match(Patterns,D),
  80.     p_investigate(Data,Patterns).
  81.  
  82. p_match([],_).
  83. p_match([P|Patterns],D) :-
  84.     (match(D,P),fail; true),
  85.     p_match(Patterns,D).
  86.  
  87. match([],[]) :- !.
  88. match([X|PRest],[Y|SRest]) :-
  89.     var(Y),!,X = Y,
  90.     match(PRest,SRest).
  91. match(List,[Y|Rest]) :- 
  92.     nonvar(Y),Y = star(X),!,
  93.     concat(X,SRest,List),
  94.     match(SRest,Rest).
  95. match([X|PRest],[Y|SRest]) :-
  96.     (atom(X) -> X = Y; match(X,Y)),
  97.     match(PRest,SRest).
  98.  
  99. concat([],L,L).
  100. concat([X|L1],L2,[X|L3]) :- concat(L1,L2,L3).
  101.